// node 26_平铺属性结构转树状结构.js

const entry = { 
  'a.b.c.dd': 'abcdd', 
  'a.d.ee': 'adee', 
//   'a.d.e.ff': 'adeff', 
  'a.f': 'af' 
 }

//目标结果：
// {
//     a:{
//         b:{
//             c:{
//                 dd:'abcdd'
//             },
//         },
//         d:{
//             ee:'adee'
//         },
//         f:'af'
//     },
// }


//方法1
//两层遍历
function operateEntry(obj) {
    let res = {} //存储最终结果
    for(let key in obj){ //第一层遍历
        let value = obj[key] //存储每个key对应的值
        let arrKey = key.split('.')//将key数组化   'a.b.c.dd' -> ["a","d","c","dd"]

        if(!res[arrKey[0]]) res[arrKey[0]] = {}//创建根属性a

        let q = res[arrKey[0]]//创建指向根属性a的指针

        for(let i=1;i<arrKey.length-1;i++){//第二层遍历，遍历key

            if(!q[arrKey[i]]) q[arrKey[i]] = {}//按key中顺序创建对应属性

            q = q[arrKey[i]]//移动指针
        }
        q[arrKey[arrKey.length-1]] = value//赋值
    }
    return res
}

//方法2
//递归
function operateEntry2(obj) {
    for(let key in obj){ //遍历第一层属性
        getNext(key)
    }
    function getNext(key) { //递归函数
        let value = obj[key] //将key对应的值进行存储
        let index = key.lastIndexOf('.')//找到当前key中最后一个'.'的索引值
        if(index != -1){//如果key中存在'.'
            delete obj[key]//删除原键值对
            let newKey = key.substring(0,index)//将key按最后一个出现'.'的位置拆分出新键
            let newValue = key.substring(index+1)//将key按最后一个出现'.'的位置拆分出新键的属性
            if(!obj[newKey]) obj[newKey] = {}//如果Obj中不存在新newKey则创建一个
            obj[newKey][newValue] = value//给newKey赋值
            if(newKey.lastIndexOf('.') != -1) getNext(newKey)//如果newKey中还存在'.'则继续递归
        }
    }

    return obj
}

//测试
console.log(operateEntry(entry))
console.log(operateEntry2(entry))